// user 子模块
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getInfo, getBaseInfo } from '@/api/user'

const state = {
  // 登录信息 token
  token: getToken(), // 我们需要将全局状态 token，放到缓存里面
  // 用户相关的信息
  userInfo: {} // 初始值，建议使用空对象
}

const mutations = {
  setToken(state, token) {
    state.token = token // 更新 vuex 里面的 token状态
    setToken(token) // 同时，需要缓存进本地
  },
  // 移除 token    -> vue this.$store.commit('setToken', null)
  removeToken(state) {
    state.token = null // 删除vuex的token
    removeToken() // 先清除 vuex  再清除缓存 vuex和 缓存数据的同步
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo // 这种直接赋值等于的操作，是具有响应式的
  }
}

const actions = {
  async login({ commit }, data) {
    // 正式发起登录请求
    try {
      const res = await login(data)
      // 把 token 进行更新
      commit('setToken', res)
      // 存储token的同时，我们也应该将当前时间戳存储
      setTimeStamp()
    } catch (error) {
      console.log(error) // 弹框显示
      return Promise.reject(error)
    }
  },
  // 获取用户信息资料：条件，调用 loadUserInfo 这个action的时候，至少要处于已登录状态
  async loadUserInfo({ commit }) {
    const userInfo = await getInfo() // 此时的 userInfo 长什么样子？{ userId mobile username }
    const baseInfo = await getBaseInfo(userInfo.userId)
    // 修改一下用户信息
    commit('setUserInfo', { ...userInfo, ...baseInfo })
    // 特意强调了一下 return userInfo
  },
  // 登出功能
  logout({ commit }) {
    // 删除token
    commit('removeToken')
    // 清除用户信息
    commit('setUserInfo', {})
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

// import { login, logout, getInfo } from '@/api/user'
// import { getToken, setToken, removeToken } from '@/utils/auth'
// import { resetRouter } from '@/router'

// const getDefaultState = () => {
//   return {
//     // token
//     token: getToken(),
//     // name 的初始值
//     name: '',
//     // 头像
//     avatar: ''
//   }
// }

// // user模块里面的状态/数据
// const state = getDefaultState()

// const mutations = {
//   // 函数名称，都是大写的
//   // 重置 state
//   RESET_STATE: (state) => {
//     // 合并对象
//     Object.assign(state, getDefaultState())
//   },
//   // 设置 token 值
//   SET_TOKEN: (state, token) => {
//     state.token = token
//   },
//   // 设置 name 的值
//   SET_NAME: (state, name) => {
//     state.name = name
//   },
//   // 设置 头像 的值
//   SET_AVATAR: (state, avatar) => {
//     state.avatar = avatar
//   }
// }

// const actions = {
//   // 用户登录
//   login({ commit }, userInfo) {
//     const { username, password } = userInfo
//     return new Promise((resolve, reject) => {
//       // 正式调用 登录 的接口
//       login({ username: username.trim(), password: password }).then(response => {
//         // 登录成功之后
//         const { data } = response
//         // 设置 token 值
//         commit('SET_TOKEN', data.token)
//         // 将登录请求回来的token，放进缓存
//         setToken(data.token)
//         // 成功
//         resolve()
//       }).catch(error => {
//         reject(error)
//       })
//     })
//   },

//   // 获取到 user 相关的信息
//   getInfo({ commit, state }) {
//     return new Promise((resolve, reject) => {
//       // 调用获取用户信息的接口
//       getInfo(state.token).then(response => {
//         const { data } = response

//         if (!data) {
//           // 如果没有获取到用户信息，提示用户鉴权失败，请求重新登录
//           return reject('Verification failed, please Login again.')
//         }

//         const { name, avatar } = data

//         // 更新 name 值
//         commit('SET_NAME', name)
//         // 更新 头像 值
//         commit('SET_AVATAR', avatar)
//         // 将请求回来的结果，抛出去
//         resolve(data)
//       }).catch(error => {
//         reject(error)
//       })
//     })
//   },

//   // 登出
//   logout({ commit, state }) {
//     return new Promise((resolve, reject) => {
//       // 调用了登出的方法
//       logout(state.token).then(() => {
//         // 移除token
//         removeToken()
//         // 重置路由表
//         resetRouter()
//         // 重置当前 state 数据
//         commit('RESET_STATE')
//         // 成功
//         resolve()
//       }).catch(error => {
//         reject(error)
//       })
//     })
//   },

//   // 移除token
//   resetToken({ commit }) {
//     return new Promise(resolve => {
//       // 移除 token 值
//       removeToken()
//       // 重置当前 state 数据
//       commit('RESET_STATE')
//       // 成功调用
//       resolve()
//     })
//   }
// }

// export default {
//   namespaced: true, // 让当前 user 子模块，开启了封闭访问
//   state,
//   mutations,
//   actions
// }
